package structureDeDonnee;

import java.util.Iterator;

/**
 * matrice implémenté grace à une liste de type myList 
 */
public class MatriceMyList implements Matrice, Iterable<Cell>{

	/**
	 * Champ contenant les données
	 */
	private MyList liste;

	/**
	 * constructeur créant une MatriceMyList avec this.liste = l
	 * @param l la liste que prendra this.liste pour valeur
	 */
	public MatriceMyList(MyList l) {
		this.liste = l;
	}
	
	/**
	 * constructeur créant une matrice vide
	 */
	public MatriceMyList() {
		this.liste = new MyList();
	}
	
	/**
	 * additionne 2 matrices
	 * @param arg la deuxieme matrice (une matrice de type MyList est attendue) 
	 * @return la nouvelle matrice
	 */
	@Override
	public Matrice addAll(Matrice arg) {
		assert (arg instanceof MatriceMyList) : "La Structure de donnée n'est pas valide";
		MatriceMyList tmp = (MatriceMyList) arg;
		return new MatriceMyList(this.liste.addAll(tmp.liste));
	}
	
	@Override
	public String toString() {
		return liste.toString();
	}

	@Override
	public Iterator<Cell> iterator() {
		return this.liste.iterator();
	}

	@Override
	public void add(Cell c) {
		this.liste.add(c);
	}

	@Override
	public void inserer(Cell c){
		this.liste.inserer(c);
	}
	
	@Override
	public boolean isEmpty() {
		return this.liste.isEmpty();
	}

	@Override
	public Cell getPremiereCellule() {
		return liste.getPremiereCellule();
	}
	
	@Override
	public Cell getDerniereCellule() {
		return liste.getDerniereCellule();
	}

	@Override
	public int length() {
		return liste.length();
	}

	@Override
	public boolean contains(Cell c) {
		return liste.contains(c);
	}

	@Override
	public Matrice sort() {
		return new MatriceMyList(this.liste.sort());
	}
	
	@Override 
	public Matrice clone() {
		return new MatriceMyList(this.liste.clone());
	}

	@Override
	public boolean memeMatrice(Matrice m) {
		
		if(m.length()!=this.length()){
			return false;
	    }
		
		Iterator<Cell> it1 = m.iterator();
		Iterator<Cell> it2 = this.iterator();
		while(it1.hasNext()){
			if(!it1.next().equals(it2.next())){
				return false;
			}
		}
		return true;
	}

	
	

}
